#include "gui_notebook.h"

/**
 * crea un nuovo notebook
 * 
 * @param mobj
 * @param x
 * @param y
 * @param w
 * @param h
 * @return notebook*
 */
notebook* gui_notebook_new(main_obj *mobj, int x, int y, int w, int h) {
    notebook *n = g_malloc0(sizeof (notebook));
    n->ge.focused = FALSE;
    n->ge.graphic = gui_util_get_new_empty_surface(w, h);
    n->ge.posx = x;
    n->ge.posy = y;
    n->ge.redraw = TRUE;
    n->ge.type = GUI_NOTEBOOK;
    n->ge.visible = TRUE;
    n->notebook_pages = NULL;
    n->current_page = -1;
    n->n_page = 0;
    n->tab_height = GUI_NOTEBOOK_TAB_HEIGHT;
    n->tab_width = GUI_NOTEBOOK_TAB_WIDTH;
    n->default_background = gui_util_get_new_empty_surface(mobj->s->vs->screen_width, mobj->s->vs->screen_height);
    n->pre_buf_tab = gui_util_get_new_empty_surface(mobj->s->vs->screen_width, mobj->s->vs->screen_height);
    roundedBoxRGBA(n->default_background, 10, 10, 400 /*n->default_background->w*/, 600 /*n->default_background->h*/, 5, 200, 200, 200, 255);
    n->paint = gui_notebook_normal_paint;
    n->update = gui_notebook_update;
    return n;
}

/**
 * crea una nuova pagina
 * 
 * @param title il titolo della pgina
 * @return notebook_page*
 */
notebook_page* gui_notebook_page_new(main_obj *mobj, notebook *n, gchar *title) {
    notebook_page *np = g_malloc0(sizeof (notebook_page));
    np->elements = NULL;
    np->title = g_string_new(title);
    notebook_page_tab * npt = (notebook_page_tab*) g_malloc0(sizeof (notebook_page_tab));
    npt->x = 0;
    npt->y = 0;
    npt->h = n->tab_height + GUI_NOTEBOOK_TAB_PADDING_N_S;
    SDL_Surface *s = gui_util_drawtext(mobj->gm->current_font, 255, 255, 255, 255, 0, 0, 0, 0, title);
    np->title_renderd = gui_util_get_new_empty_surface(s->w, s->h);
    SDL_BlitSurface(s, 0, np->title_renderd, 0);
/*
    np->title_renderd = s;
*/
    npt->w = s->w + GUI_NOTEBOOK_TAB_PADDING_W_E * 2;
    int i;
    int l = g_list_length(n->notebook_pages);
    for (i = 0; i < l; i++) {
        notebook_page *_np = (notebook_page*) g_list_nth_data(n->notebook_pages, i);
        npt->x += _np->npt->w;
    }
    np->npt = npt;
    return np;
}

/**
 * esegue il paint della notebook_page corrente
 * 
 * @param mobj
 * @param n
 * @return 
 */
gboolean gui_notebook_normal_paint(main_obj *mobj, notebook *n) {
    if (n->n_page == 0) {
        return TRUE;
    }
    if (n->current_page == -1) {
        return TRUE;
    }
    /* ottengo la page corrente */
    notebook_page *np = (notebook_page*) g_list_nth_data(n->notebook_pages, n->current_page);
    SDL_Rect rect;
    int i = 0, l = 0;

    SDL_FillRect(n->ge.graphic, 0, SDL_MapRGBA(mobj->main_screen->format, 0, 0, 0, 0));

    rect.x = 0;
    rect.y = 0;

    SDL_BlitSurface(n->default_background, 0, n->ge.graphic, &rect);

    l = g_list_length(n->notebook_pages);
    /* disegno i tab del notebook */
    for (i = 0; i < l; i++) {
        notebook_page *_np = (notebook_page*) g_list_nth_data(n->notebook_pages, i);
        roundedBoxRGBA(n->ge.graphic, _np->npt->x + (GUI_NOTEBOOK_TAB_SPACING * i), _np->npt->y, (_np->npt->x + _np->npt->w) + (GUI_NOTEBOOK_TAB_SPACING * i), (_np->npt->y + _np->npt->h), 5, 180, 180, 180, 255);
        rect.x = _np->npt->x + GUI_NOTEBOOK_TAB_PADDING_W_E + GUI_NOTEBOOK_TAB_SPACING * i;
        rect.y = _np->npt->y + GUI_NOTEBOOK_TAB_PADDING_N_S;
        SDL_BlitSurface(_np->title_renderd, 0, n->ge.graphic, &rect);
    }
    
    
    g_debug("surface height: %d", n->ge.graphic->h);

    /* disegno tutti gli elementi nella page corrrente */
    l = g_list_length(np->elements);

    for (i = 0; i < l; i++) {
        gpointer p = (gpointer) g_list_nth_data(np->elements, i);
        /* ottengo l'elemento grafico corrente */
        graphic_element *ge = (graphic_element*) p;
        /* se gli elementi vanno ridisegnati */
        if (ge->redraw) {
            /* eseguo il rendering a seconda del tipo di elemento */
            switch (ge->type) {
                case (GUI_BUTTON):
                {
                    button *b = (button*) p;
                    b->paint(mobj, b);
                    break;
                }
                case (GUI_LABEL):
                {
                    label *l = (label*) p;
                    l->paint(mobj, l);
                    break;
                }
                case (GUI_TEXTBOX):
                {
                    textbox *t = (textbox*) p;
                    t->paint(mobj, t);
                    break;
                }
            }
            rect.x = ge->posx;
            rect.y = ge->posy;
            SDL_BlitSurface(ge->graphic, 0, n->ge.graphic, &rect);
            //SDL_BlitSurface(ge->graphic, 0, n->ge.graphic, &rect);
        }
    }
    return TRUE;
}

/**
 * aggiorna tutti gli elementi contenuti nell notebook
 * 
 * @param mobj main_obj*
 * @param n il notebook di riferimento
 * @return gboolean
 */
gboolean gui_notebook_update(main_obj *mobj, notebook *n) {
    /* verifico che ci sia almeno una pagina
     * altrimenti non aggiorno l'elemento
     */
    if (g_list_length(n->notebook_pages) == 0) {
        return TRUE;
    }
    /* verifico se è selezionata una pagina
     * altrimenti seleziono la prima
     */
    if (n->current_page == -1) {
        n->current_page = 0;
    }
    /* necessario per le successive iterazioni */
    int i = 0;
    if (mobj->event->type == SDL_MOUSEBUTTONDOWN) {
        //float nb = ((float)(n->tab_width * n->n_page) + (float) mobj->event->button.x) / ((float) n->n_page);
        for (i = 0; i < n->n_page; i++) {
            /**
             * analizzo tutte le strutture notebook_page e
             * verifica se una è stata premuta
             */
            /* TODO correggere controllo click */
            notebook_page *np = (notebook_page*) g_list_nth_data(n->notebook_pages, i);
            if ((mobj->event->button.x >= (np->npt->x)) && (mobj->event->button.x <= (np->npt->x + np->npt->w))) {
                if ((mobj->event->button.y >= np->npt->y) && (mobj->event->button.y <= (np->npt->y + np->npt->h))) {
                    /* se è stata premuta la imposto il suo indice come selezionato */
                    n->current_page = i;
                }
            }
        }
    }
    notebook_page *np = (notebook_page*) g_list_nth_data(n->notebook_pages, n->current_page);
    int l = g_list_length(np->elements);
    for (i = 0; i < l; i++) {
        graphic_element *ge = (graphic_element*) g_list_nth_data(np->elements, i);
        switch (ge->type) {
            case (GUI_BUTTON):
            {
                button *b = (button*) ge;
                b->update(mobj, b);
                break;
            }
            case (GUI_TEXTBOX):
            {
                textbox *t = (textbox*) ge;
                t->update(mobj, t);
                break;
            }
            case (GUI_LABEL):
            {
                label *l = (label*) ge;
                l->update(mobj, l);
                break;
            }
        }
    }
    return TRUE;
}

/**
 * aggiunge un elemento grafico alla notebook page
 * rapprresentata dall'index
 * 
 * @param n notebook di riferimento
 * @param index indice della notebook page
 * @param p il puntatore all'elemento grafico
 * @return gboolean
 */
gboolean gui_notebook_page_add_element(notebook *n, gint index, gpointer p) {
    notebook_page *np = (notebook_page*) g_list_nth_data(n->notebook_pages, index);
    np->elements = g_list_append(np->elements, p);
    return TRUE;
}

/**
 * aggiunge una pagina al notebook
 * 
 * @param n notebook*
 * @param np notebook_page*
 * @return gboolean
 */
gboolean gui_notebook_add_page(notebook *n, notebook_page *np) {
    n->notebook_pages = g_list_append(n->notebook_pages, np);
    n->n_page += 1;
    return TRUE;
}
